home *** CD-ROM | disk | FTP | other *** search
/ Ham Radio 2000 / Ham Radio 2000.iso / ham2000 / tcp_ip / tnos / tnos100s / sam.c < prev    next >
C/C++ Source or Header  |  1993-11-27  |  7KB  |  234 lines

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include "global.h"
  4. #include "mbuf.h"
  5. #include "socket.h"
  6. #include "session.h"
  7. #include "proc.h"
  8. #include "netuser.h"
  9. #include "commands.h"
  10. #include "tty.h"
  11. #include "config.h"
  12. #include "samapi.h"            /* samapi interface spec */
  13.  
  14. #ifdef SAMCALLB
  15. /*
  16.  * functions in samlib.c
  17.  */
  18.  
  19. int LocateSam(void);
  20. int CallSam(int cmd, void far *cmdbuf, void far *rspbuf);
  21. extern char *Callserver;  /* buckbook.c */
  22. extern int usesplit;
  23. int cb_lookup __ARGS((int s,char *str,FILE *fp));
  24. static char Nofind[] = "*** Call not found in SAM database of %s as of %s\n\n";
  25. static char callhdr[] = "Amateur Radio Callsign: %s  (%s Class)  born in 19%s\n";
  26. int SAMoutbytes = 0;
  27. extern void *malloc __ARGS((unsigned nb));
  28. extern void leadingCaps __ARGS((char *str, int mode));
  29.  
  30.  
  31. int
  32. docallbook(argc,argv,p)
  33. int argc;
  34. char *argv[];
  35. void *p;
  36. {
  37. struct sockaddr_in sock;
  38. char *cp;
  39. int s,i;
  40. struct mbuf *bp;
  41. struct session *sp;
  42. int thesocket, err;
  43.  
  44.     /*Make sure this comes from console - WG7J*/
  45.     if(Curproc->input != Command->input)
  46.         return 0;
  47.  
  48.     /* Allocate a session descriptor */
  49.     if((sp = newsession(argv[1],TELNET,0)) == NULLSESSION){
  50.         tputs(TooManySessions);
  51.         keywait(NULLCHAR,1);
  52.         return 1;
  53.     }
  54.     sp->ttystate.echo = sp->ttystate.edit = 0;
  55.     sp->flowmode = 1;
  56.     sock.sin_family = AF_INET;
  57.     sock.sin_port = IPPORT_CALLDB;
  58.     thesocket = Curproc->output;
  59.     for(i=1;i<argc;i++){
  60.         if (!Callserver || !*Callserver)    {
  61.             tprintf("\n");
  62.             if ((err = cb_lookup (Curproc->output, argv[i], (FILE *) 0)) != 0)
  63.                 tprintf ((err == 1) ? "SAMAPI not loaded!\n" : "Amateur Call '%s' not found or invalid!\n", argv[i]);
  64.             continue;
  65.         }
  66.         tprintf("Resolving %s... ",Callserver);
  67.         if((sock.sin_addr.s_addr = resolve(Callserver)) == 0){
  68.             tprintf("Host %s unknown\n",Callserver);
  69.             continue;
  70.         }
  71.         tprintf("trying %s",psocket((struct sockaddr *)&sock));
  72.         if((sp->s = s = socket(AF_INET,SOCK_STREAM,0)) == -1){
  73.             tputs(Nosock);
  74.         break;
  75.         }
  76.         sockmode(s,SOCK_ASCII);
  77.         if(connect(s,(char *)&sock,sizeof(sock)) == -1){
  78.             cp = sockerr(s);
  79.             tprintf(" -- Connect failed: %s\n",cp != NULLCHAR ? cp : "");
  80.             close_s(s);
  81.             sp->s = -1;
  82.             continue;
  83.         }
  84.         tprintf("\n");
  85.         usflush(thesocket);
  86.         usprintf(s,"%s\n",argv[i]);
  87.         while(recv_mbuf(s,&bp,0,NULLCHAR,(int *)0) > 0){
  88.             send_mbuf(thesocket,bp,0,NULLCHAR,0);
  89.         }
  90.         close_s(s);
  91.         sp->s = -1;
  92.     }
  93.     keywait(NULLCHAR,1);
  94.     freesession(sp);
  95.     return 0;
  96. }
  97.  
  98.  
  99. static int
  100. cb_look (str, incall, outcall, err)
  101. char *str;
  102. cmdfindcall_t *incall;
  103. rspdatarec_t *outcall;
  104. int *err;
  105. {
  106.     if (strlen(str) > 6)
  107.         return 2;        /* not an amateur call */
  108.     /* make sure the resident code (SAMAPI.EXE) has been installed */
  109.     if (LocateSam())
  110.         return 1;
  111.  
  112.     /* build command block and call SAMAPI, function SamFindCall */
  113.     incall->packflags = 0;    /* 0 to unpack all data record fields */
  114.     strncpy(incall->call, str, 6);
  115.     incall->call[6] = 0;
  116.     *err = CallSam(SamFindCall, incall, outcall);
  117.     return 0;
  118. }
  119.  
  120.  
  121. char *
  122. cb_lookname (str)
  123. char *str;
  124. {
  125. int err;
  126. cmdfindcall_t sam_in;    /* buffer for samapi find command */
  127. rspdatarec_t sam_out;    /* buffer for result of samapi find command */
  128. char *name, from[8], *cp;
  129.  
  130.     strncpy (from, str, 6);
  131.     from[6] = 0;
  132.     if ((cp = strchr (from, '@')) != 0)
  133.         *cp = 0;
  134.     if ((cp = strchr (from, '%')) != 0)
  135.         *cp = 0;
  136.  
  137.     if (cb_look (from, &sam_in, &sam_out, &err) || err == SerrNotFound)
  138.         return ((char *) 0);
  139.      
  140.     name = malloc(strlen(sam_out.d.FirstName) + strlen(sam_out.d.LastName) + 7);
  141.     if (name)    {
  142.         leadingCaps (&sam_out.d.FirstName[1], 1);
  143.         leadingCaps (&sam_out.d.LastName[1], 0);
  144.         sprintf(name, " (%s ", sam_out.d.FirstName);
  145.         if (sam_out.d.MidInitial[0] != ' ')
  146.             sprintf (&name[strlen(name)], "%s. ", sam_out.d.MidInitial);
  147.         sprintf (&name[strlen(name)], "%s)", sam_out.d.LastName);
  148.     }
  149.     return (name);
  150. }
  151.  
  152.  
  153.  
  154. /* return values - 1=SAMAPI not found, 2=call not found or invalid, 0=okay */
  155. int
  156. cb_lookup (s, str, fp)
  157. int s;
  158. char *str;
  159. FILE *fp;
  160. {
  161. int err, response;
  162. cmdfindcall_t sam_in;    /* buffer for samapi find command */
  163. rspdatarec_t sam_out;    /* buffer for result of samapi find command */
  164. cmdfindcounty_t cty_in;    /* buffer for find county command */
  165. rspfindcounty_t cty_out;    /* buffer for find county response */
  166. rhdr_t date_in;
  167. rspdbdate_t date_out;
  168. char *class;
  169.  
  170.     SAMoutbytes = 0;
  171.     if ((response = cb_look (str, &sam_in, &sam_out, &err)) != 0)
  172.         return response;
  173.  
  174.     /* check for unusual error something other that plain ole not found */
  175.     if (err != 0 && err != SerrNotFound)
  176.         return 2;
  177.  
  178.     /* check for just not found */
  179.  
  180.     if (err == SerrNotFound)    {
  181.         err = CallSam(SamGetDatabaseDate, &date_in, &date_out);
  182.         if (fp)
  183.             SAMoutbytes += fprintf (fp, Nofind, date_out.scope, date_out.date);
  184.         else
  185.             SAMoutbytes += usprintf(s, Nofind, date_out.scope, date_out.date);
  186.         return 2;
  187.     }
  188.  
  189.     switch (sam_out.d.Class[0])    {
  190.         case 'N':    class = "Novice";
  191.                 break;
  192.         case 'T':    class = "Technician";
  193.                 break;
  194.         case 'G':    class = "General";
  195.                 break;
  196.         case 'A':    class = "Advanced";
  197.                 break;
  198.         case 'E':    class = "Extra";
  199.                 break;
  200.     }
  201.  
  202.     if (fp)    {
  203.         /* display call with leading space stripped */
  204.         SAMoutbytes += fprintf(fp, callhdr, sam_out.d.Call + (sam_out.d.Call[0] == ' '), class, sam_out.d.Dob);
  205.  
  206.         /* display first m last, but leave out middle and space if no middle initial */
  207.         SAMoutbytes += fprintf(fp, "%s ", sam_out.d.FirstName);
  208.         if (sam_out.d.MidInitial[0] != ' ')
  209.             SAMoutbytes += fprintf(fp, "%s ", sam_out.d.MidInitial);
  210.         SAMoutbytes += fprintf(fp, "%s\n", sam_out.d.LastName);
  211.  
  212.         /* address line, then city, st zip */
  213.         SAMoutbytes += fprintf(fp, "%s\n", sam_out.d.Address);
  214.         SAMoutbytes += fprintf(fp, "%s, %s %s\n\n", sam_out.d.City, sam_out.d.State, sam_out.d.Zip);
  215.     } else    {
  216.         /* display call with leading space stripped */
  217.         SAMoutbytes += usprintf(s, callhdr, sam_out.d.Call + (sam_out.d.Call[0] == ' '), class, sam_out.d.Dob);
  218.  
  219.         /* display first m last, but leave out middle and space if no middle initial */
  220.         SAMoutbytes += usprintf(s, "%s ", sam_out.d.FirstName);
  221.         if (sam_out.d.MidInitial[0] != ' ')
  222.             SAMoutbytes += usprintf(s, "%s ", sam_out.d.MidInitial);
  223.         SAMoutbytes += usprintf(s, "%s\n", sam_out.d.LastName);
  224.  
  225.         /* address line, then city, st zip */
  226.         SAMoutbytes += usprintf(s, "%s\n", sam_out.d.Address);
  227.         SAMoutbytes += usprintf(s, "%s, %s %s\n\n", sam_out.d.City, sam_out.d.State, sam_out.d.Zip);
  228.     }
  229.     return 0;
  230. }
  231. #endif
  232.  
  233.  
  234.